In [1]:
from IPython.display import HTML

HTML('''<script>
code_show=true; 
function code_toggle() {
 if (code_show){
 $('div.input').hide();
 } else {
 $('div.input').show();
 }
 code_show = !code_show
} 
$( document ).ready(code_toggle);
</script>
<form action="javascript:code_toggle()"><input type="submit" value="Click here to toggle on/off the raw code."></form>''')
Out[1]:

La opinión en Twitter, Facebook e Instagram sobre el simulacro. Reporte 8

Por: Laura Merchán

Intervalo de tiempo analizado:

22-03-2020 4:00 p.m a 23-03-2020 05:30 a.m

Sobre el ejercicio:

  1. Construí una red que representa las interacciones de los usuarios de Twitter que publican tuits con los hashtags "simulacrovital","bogotasequedaencasa","simulacrodeaislamiento","cuarentenaobligatoria bogota", "cuarentenaobligatoria bogotá","yomequedoencasa bogota","yomequedoencasa bogotá","quedateencasa bogotá", "quedateencasa bogota" y descargué los tuits asociados al tema. Con métodos de análisis de redes y text mining detecté los influenciadores y temas más importantes en esta conversación. Este ejercicio puede replicarse monitoreando cualquier otra palabra clave, hashtag o usuario.

  2. Revisé los posts en Facebook e Instagram con más interacciones que incluyen la palara Bogotá y fueron realizados en el periodo de tiempo analizado. Este ejercicio se realizó con CrowdTangle.

DISCLAIMER: Este archivo se escribe en 15 minutos. Me disculpo por posibles errores de redacción y ortografía.

Hallazgos principales:

  1. En Twitter la conversación gira en torno a la mejora de la calidad del aire, el cuidado de animales sin hogar y la difusión de información oficial de la alcaldía.

  2. Hay dos comunidades pequeñas, pero con más de 5% de los nodos, que cuestionan (sin criticar directamente) el simulacro replicando mensajes de fuentes no oficiales (@penalosadas o @bogota__dc, por ejemplo)y de figuras públicas como Petro y Morris.

  3. En Facebook el tema central es el plan retorno para quienes salieron de Bogotá Tanto la alcaldesa como el Gob de Cundinamarca tienen visibilidad en estas noticias. Otras noticias compartidas en Facebook son la disponibilidad de Corferias para atención a enfermos y un reporte de que las palomas están muriendo de hambre.
  4. En Instagram los posts más populares cubren el tercer día del simulacro desde cuentas como ultimahoracol, Claudia López y El Espectador. **Uno de los posts más populares es el del humorista polilla pidiendo sanciones económicas para quienes salieron de la ciudad.
In [59]:
import json
from bson.json_util import dumps, CANONICAL_JSON_OPTIONS
from bson import Binary, Code
from collections import Counter, OrderedDict
import pyperclip
import spacy
from wordcloud import WordCloud
from stop_words import get_stop_words
import string
import altair as alt
import matplotlib.pyplot as plt
nlp=spacy.load('es_core_news_sm')
import pandas as pd
stopwords_es= get_stop_words('es')
import pandas as pd
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import collections
import tweepy
import csv
import operator
import community
from IPython.display import Markdown,display
from datetime import datetime
import dateutil
In [93]:
from pymongo import MongoClient
client = MongoClient()
db = client.corona

Análisis de comunidades en Twitter

In [94]:
G=nx.read_graphml("/home/laufernanda/Documents/corona-redes/simulacro8.graphml")
print('La red tiene ',G.number_of_nodes(),'usuarios y ',G.number_of_edges(),"interacciones")
La red tiene  3640 usuarios y  9527 interacciones
In [95]:
from IPython.display import Image
Image(filename='image8.png') 
Out[95]:
In [99]:
G= nx.DiGraph(G)
#centrality = nx.eigenvector_centrality(G)

for node in G.nodes():
    G.nodes[node]["in_degree"]=G.in_degree[node]
    G.nodes[node]["out_degree"]=G.out_degree[node]
    #G.nodes[node]["eigenvector"]=centrality[node]
In [100]:
H=G.to_undirected()
partition=community.best_partition(H)
for node in G.nodes() :
    G.node[node]['comunidad']= partition[node]
In [101]:
#Análisis comunidades
#Tamano comunidades
c=Counter(list(partition.values()))
c=OrderedDict(c.most_common())
n=G.number_of_nodes()/20
comunidades_importantes=[]
for k in c.keys():
    if c[k]>= n:
        comunidades_importantes.append(k)
print("La red tiene ", len(comunidades_importantes), " comunidades importantes (tienen más del 5% de los nodos)" )
La red tiene  3  comunidades importantes (tienen más del 5% de los nodos)
In [102]:
top_reacciones={}
top_creadores={}
top_influencers={}
grado_in=sorted(G.in_degree(),key=operator.itemgetter(1),reverse=True)
for comunidad in comunidades_importantes:
    nodos_comunidad=[node for node in G.nodes() if G.nodes[node]['comunidad']==comunidad]
    grado_in=sorted(G.in_degree(nodos_comunidad),key=operator.itemgetter(1),reverse=True)
    grado_out=sorted(G.out_degree(nodos_comunidad),key=operator.itemgetter(1),reverse=True)
    eigen={k:v for k,v in centrality.items() if k in nodos_comunidad}
    eigen=sorted(eigen,key=operator.itemgetter(1),reverse=True)
    top_reacciones[comunidad]=[x[0] for x in grado_in[0:5]]
    top_creadores[comunidad]=[x[0] for x in grado_out[0:5]]
    top_influencers[comunidad]=eigen[0:5]

¿De qué hablan las comunidades con más usuarios?

De la comunidad con más nodos (usuarios) a la de menos:

  1. (Verde en la gráfica) Es una comunidad de difusión de los resultados positivos de calidad del aire.También contiene la difusión de las indicaciones de la alcaldía para retornar a Bogotá.

  2. (Azul en la gráfica) Es una comunidad de difusión de información oficial regional (Cundinamarca-Bogotá) enfocada en el plan retorno para quienes salieron de Bogotá.La cuenta del gobernador de Cundinamarca, la alcaldía y la W Radio son las más visibles. Uno de los tuits populares pide sanciones a quienes salieron.

  3. (Rojo en la gráfica )Es una comunidad de Preocupación ciudadana por el bienestar de los animales. Solicitan vigilancia en las Plazas de mercado de la ciudad y apoyo para protección de animales sin hogar.

In [104]:
import pytz
start = datetime(2020, 3, 22, 21, 00, 00, 0, pytz.UTC)
end = datetime(2020, 3, 23, 10, 30, 00, 0, pytz.UTC)
In [105]:
count=0
for comunidad in comunidades_importantes:
    count+=1
    display(Markdown(str("## Comunidad "+ str(count) + ":")))
    
    display(Markdown(str("**La comunidad "+ str(count)+ " tiene "+ str(c[comunidad])+" usuarios**")))
    display(Markdown(str("**La comunidad "+ str(count)+ " habla de:**")))
    nodos_comunidad=[node for node in G.nodes() if G.nodes[node]['comunidad']==comunidad]
    nodos_comunidad=[sub.replace('@', '') for sub in nodos_comunidad] 
    tw_iter=db.simulacro.find({"user.screen_name":{"$in":nodos_comunidad}})
    text=[]
    ids_filtrados=[]
    for tweet in tw_iter:
        tw=tweet
        date_tuit=dateutil.parser.parse(tw["created_at"])
        if(start<date_tuit< end):
            ids_filtrados.append(tw['_id'])
            text.append(tweet["text"])
    if len(text)>=1:
        text_s=" ".join(text)
        text_s=text_s.replace("https"," ")
        text_s=text_s.replace("RT"," ")

        wordcloud =  WordCloud(scale=2, max_words=2000,relative_scaling=0.5,background_color ='white',stopwords=stopwords_es).generate(text_s)

        plt.imshow(wordcloud)
        plt.axis("off")
        plt.show()
    print("Se incluyeron ",len(text), "tuits producidos por nodos de esta comunidad en el intervalo de tiempo analizado.")
    
    display(Markdown(str("**los usuarios que son más retuiteados, mencionados o citados en la comunidad "+ str(count) + " son:**"+
                         ", ".join(top_reacciones[comunidad]))))
    print("__________________________________________________________________________________________________________________")
    
    display(Markdown(str("**los usuarios que retuitean, mencionan y citan más en la comunidad "+ str(count) + " son:**"+
                         ", ".join(top_creadores[comunidad]))))
    #print("__________________________________________________________________________________________________________________")
    #display(Markdown(str("**los usuarios con mayor influencia en la comunidad "+ str(comunidad) + " son:**"+
    #                     ", ".join(top_influencers[comunidad]))))
    #print("__________________________________________________________________________________________________________________")
    display(Markdown(str("**los trinos más retuiteados de la comunidad "+ str(count) + " son:**")))
    nodos_comunidad=[node for node in G.nodes() if G.nodes[node]['comunidad']==comunidad]
    nodos_comunidad=[sub.replace('@', '') for sub in nodos_comunidad]
    
    #Top most retweeted tweets
    tw_iter_RT = db.simulacro.aggregate([
        {"$match": {
            "$and":[ {"retweeted_status": {"$exists": True}},
                   {"_id":{"$in":ids_filtrados}}
                   ]}},
        {"$replaceRoot": { "newRoot": "$retweeted_status" }},
        {"$group" : {"_id":"$id",
                     "text":{"$last":"$extended_tweet.full_text"},
                     "username":{"$last":"$user.screen_name"},
                     "count":{"$sum":1}}},
        {"$sort": {"count": -1}}
        ])
    try:
        top = [tw_iter_RT.next() for i in range(10)]
        df= pd.DataFrame(top)
        pd.set_option("max_colwidth",300)
        display(df)
    except:
        top = list(tw_iter_RT)
        df= pd.DataFrame(top)
        display(df)
        print("no hay suficiente info disponible")
        

    display(Markdown(str("**los hashtags más usados en la comunidad "+ str(count) + " son:**")))
    
    #Hashtgas
    #Top most used hashtags
    tw_iter_HT = db.simulacro.aggregate([
        {"$match":{"_id":{"$in":ids_filtrados}}},
        {"$unwind": "$entities.hashtags"},
        {"$group" : {"_id":"$entities.hashtags.text",
                   "count":{"$sum":1}}},
        {"$sort": {"count": -1}}
    ])
    try:
        top = [tw_iter_HT.next() for i in range(5)]
        df= pd.DataFrame(top)
        display(df)
    except:
        top = list(tw_iter_HT)
        df= pd.DataFrame(top)
        display(df)
        print("no hay suficiente info disponible")

Comunidad 1:

La comunidad 1 tiene 1107 usuarios

La comunidad 1 habla de:

Se incluyeron  206 tuits producidos por nodos de esta comunidad en el intervalo de tiempo analizado.

los usuarios que son más retuiteados, mencionados o citados en la comunidad 1 son:@claudialopez, @ambientebogota, @theogelves, @corferiasbogota, @danielbejarano_

__________________________________________________________________________________________________________________

los usuarios que retuitean, mencionan y citan más en la comunidad 1 son:@claudialopez, @trotaaa, @jimmyapa, @edwinpabon36, @yobaniperdomos

los trinos más retuiteados de la comunidad 1 son:

_id count text username
0 1241821824406769667 124 Una buena noticia! \n\nGracias al cambio de los vientos, que fueron moviendo material particulado por incendios en el resto del país que nos habían llegado, más la inmovilización por #SimulacroVital mejoramos la calidad del aire! \n\nUn riesgo menos de enfermedad respiratoria! 🙏🏻 ClaudiaLopez
1 1241713267401252868 35 ¡Mejoramos! 💪🏻 Bogotá vuelve a tener sus 13 estaciones en condiciones moderadas 🟢. La reducción habitual de la emisiones durante el #SimulacroVital y los cambios en los vientos han disminuido el material particulado en la atmósfera de la ciudad. Reporte: https://t.co/TxCMMksQze https://t.co/knT... Ambientebogota
2 1241859222557655041 3 "Nadie en Bogotá se va a quedar sin abrigo": señaló la alcaldesa @ClaudiaLopez, que también afirmó que #TodoSaldráBien y que debemos quedarnos en casa, cuidarnos, cuidar a los nuestros, y acogernos a las medidas del #SimulacroVital obligatorio para superar la pandemia ¡Ánimo! https://t.co/rekeKS... Bogota
3 1241875498764046336 3 "Con el propósito de facilitar el ingreso a las personas que salieron de la ciudad durante este fin de semana y así prepararnos mejor para la cuarentena, este será el horario de entrada a la ciudad para los días lunes 23 y martes 24 de marzo": @ClaudiaLopez \n\nBaja el hilo👇🏼 https://t.co/m5zV6F... Bogota
4 1241864475046633472 3 None Bogota
5 1241838305194520576 2 Sabemos que #TodoSaldráBien con solidaridad y empatía. \n\nRecuerda que durante el #SimulacroVital obligatorio y la #CuarentenaPorLaVida, las tiendas de barrio, cafeterías, restaurantes, droguerías, minimercados, papelerías y veterinarias funcionarán normalmente. https://t.co/9niNDDIaMf Ambientebogota
6 1241925051332657153 2 None confidencialcol
7 1241399844767440901 2 Por esta época de cuarentena me doy cuenta de que es más valioso tener internet que otras cosas, por eso nadie es extrañado, no espere un beso, una llamada y menos la ayuda, saben por qué? Porque nos volvimos esclavos de las redes y la basura que nos ofrecen. #Covid_19 #Bogota Argentia2012
8 1241764737152581632 2 #SimulacroVitalObligatorio se extiende hasta el MARTES y empalmará con cuarentena nacional,conozca las declaraciones dadas por la alcaldesa @ClaudiaLopez \n\nhttps://t.co/0bByhHxFvj Bogota
9 1241909858976387072 1 Claudia, en la Bogotá popular el simulacro se cumple muy parcialmente: sale mucha gente, cada rato, a comprar, como si todo estuviera "normal". \n\nVale la pena que estudie la propuesta del pico y placa por número de cédula. De lo contrario, se reduce el impacto del confinamiento. Suaguagua

los hashtags más usados en la comunidad 1 son:

_id count
0 TodoSaldráBien 9
1 SimulacroVital 7
2 YoMeQuedoEnCasa 3
3 QuedateEnCasa 2
4 FelizDomingo 2

Comunidad 2:

La comunidad 2 tiene 1009 usuarios

La comunidad 2 habla de:

Se incluyeron  183 tuits producidos por nodos de esta comunidad en el intervalo de tiempo analizado.

los usuarios que son más retuiteados, mencionados o citados en la comunidad 2 son:@bogota, @nicolasgarciab, @cundinamarcagob, @wradiocolombia, @policiacmarca

__________________________________________________________________________________________________________________

los usuarios que retuitean, mencionan y citan más en la comunidad 2 son:@sasalin28, @mpilarmunoz1, @solstereofm, @marcialito29, @jfervargascr

los trinos más retuiteados de la comunidad 2 son:

_id count text username
0 1241850177956257797 35 Hemos decidido en conjunto con @Bogota generar una excepción al decreto de #SimulacroVital. Vehículos podrán ingresar a la capital el día lunes 23 y martes 24 en horario específico. Quienes ingresen tendrán que diligenciar documento que nos permitirá generar una sanción social. https://t.co/nW1y... nicolasgarciab
1 1241864475046633472 14 None Bogota
2 1241920114393583623 12 Así estuvo nuestra ciudad en este tercer día del #SimulacroVital obligatorio ¡Quédate en casa! Cuidarnos es un compromiso de todos.😉\n#TodoSaldráBien \n#YoMeQuedoEnCasa 🏡 https://t.co/Lq1HPwBTZP Bogota
3 1241850305182158858 6 Nuevamente nuestro llamado a acatar las medidas que venimos implementando, desobedecerlas trae graves consecuencias para todos. Quienes salieron de @Bogota hacia Cundinamarca tratando de evadir #SimulacroVital nos pusieron en riesgo a todos. No permitiremos que lo vuelvan a hacer https://t.co/fV... nicolasgarciab
4 1241721266861678593 6 En medio de la crisis los campesinos de Cmarca siguen siendo ejemplo de trabajo y fortaleza. Hoy domingo 22 de marzo, tercer día de #SimulacroVital, se reporta el ingreso de 674 vehículos para abastecer Bogotá, son 6.131 toneladas, cuando el promedio un día como hoy es de 3.250. nicolasgarciab
5 1241871121718312965 6 El gobernador @nicolasgarciab generó con @Bogota una excepción al decreto de #SimulacroVital. Quienes ingresen tendrán que diligenciar un dto que les generará una sanción, pues evadiendo la medida pusieron en riesgo a los cundinamarqueses. Estos son los horarios de ingreso a Btá. https://t.co/TM... CundinamarcaGob
6 1241857811635679237 6 #NoticiaW II Hemos decidido en conjunto con @Bogota generar una excepción al decreto de #SimulacroVital. Vehículos podrán ingresar a la capital el día lunes 23 y martes 24 en horario específico. Quienes ingresen tendrán que diligenciar documento para generar una sanción social. WRadioColombia
7 1241876491379585026 5 Igualito a cuando como padres les decimos a los hijos...pero no lo vuelva a hacer...y tenga.\n...Discúlpenme, pero aún me retumba en la cabeza el dichoso carnet de la Dimayor. JULIOC_HERRERA
8 1241920285885988865 5 Que pendejada,Por eso las leyes se las pasan por la faja,Exijo respeto con los qué si acatamos sin importar los perjuicios Se trata de respeto y solidaridad ciudadana. gmonterofarias
9 1241728532272893952 4 A esta hora estoy sacando a Nilo a hacer sus necesidades en el marco de una de las excepciones del Decreto. Recuerden que el paseo es máximo de 20 minutos y debemos tomar todas las precauciones de regreso limpiando sus patas y nuestros zapatos.\n#EchePaLaCasa\n#SimulacroVital https://t.co/Luw5gy... nicolasgarciab

los hashtags más usados en la comunidad 2 son:

_id count
0 SimulacroVital 84
1 TodoSaldráBien 15
2 YoMeQuedoEnCasa 14
3 NoticiaW 6
4 colombia 1

Comunidad 3:

La comunidad 3 tiene 277 usuarios

La comunidad 3 habla de:

Se incluyeron  82 tuits producidos por nodos de esta comunidad en el intervalo de tiempo analizado.

los usuarios que son más retuiteados, mencionados o citados en la comunidad 3 son:@animalesbog, @juliherrerap, @andreanimalidad, @nelsongomez09, @mellanovha

__________________________________________________________________________________________________________________

los usuarios que retuitean, mencionan y citan más en la comunidad 3 son:@banpercie, @luciaziqueira, @diaanimales, @alejitamaya84, @pnalllano

los trinos más retuiteados de la comunidad 3 son:

_id count text username
0 1241822179186089987 14 Sobre verificación a comercios de animales en la Avenida Caracas durante el #SimulacroVital en Bogotá. Estaremos haciendo seguimiento permanente. En caso de que se reciban más denuncias, las autoridades competentes tomarán las medidas correspondientes. https://t.co/kAhQdHc8Y7 AnimalesBOG
1 1241696557092798465 12 Hay gente extraordinaria haciendo cosas maravillosas por los seres que muchos olvidan en este #SimulacroVital y #AislamientoObligatorio. No piden q todos hagamos lo mismo, pero sí que les ayudemos en esta misión! Los perritos están abriendo las bolsas de basura, mueren de hambre https://t.co/lDd... juliherrerap
2 1241904030584057856 11 None juliherrerap
3 1241924144582799360 6 Conocemos esta zona de #Usme y allí también hay excelentes proteccionistas como @alexapavadiaz que hacen continuamente jornadas de alimentación con más personas. \n\n🆘Urgente🆘 @ClaudiaLopez y @IvanDuque tengan en cuenta estás situaciones para que ellos no queden desatendidos 🐾. https://t.co/G3sw... DiaAnimales
4 1241853340201426950 6 Sr. Director @NelsonGomez09 @AnimalesBOG hay que hacer operativos en todas las plazas de mercado donde se venden animales vivos (73 locales aprox.), en las tiendas de barrio y en los locales ubicados en centro comerciales como los tres elefantes. andreanimalidad
5 1241726154857418752 4 Durante el segundo día del #SimulacroVital atendimos cuatro casos de urgencias veterinarias por llamados a Línea 123. Asistimos y trasladamos a los animales a clínicas veterinarias especializadas para realizar exámenes complementarios, diagnóstico y tratamiento. #NoParamos https://t.co/lsK2XfrACV AnimalesBOG
6 1241699477381152768 3 Eso ocurre en el Barrio Juan Rey de #Bogotá. Hay muchísimos animales en condición de calle y ya proteccionistas no dan a basto. Todo se ha agudizado por la coyuntura. NO PIDEN DINERO\nNecesitan: \n-Concentrado 🐶🐱\n- Menudencias🍖🍗🥩\n-Arroz 🍚\nTeléfonos: 3173751143 - 3197976275 MellanoVha
7 1241792172157997062 2 Para gatos y perros como ellos estamos reuniendo donaciones. El martes compraremos alimento y se los entregaremos a proteccionistas. Solicitamos a la alcaldesa @ClaudiaLopez permiso para que algunas de ellas puedan desplazarse para alimentar a los animales durante la cuarentena. andreanimalidad
8 1241821824406769667 2 Una buena noticia! \n\nGracias al cambio de los vientos, que fueron moviendo material particulado por incendios en el resto del país que nos habían llegado, más la inmovilización por #SimulacroVital mejoramos la calidad del aire! \n\nUn riesgo menos de enfermedad respiratoria! 🙏🏻 ClaudiaLopez
9 1241925891636244482 2 Es el mismo caso que compartieron @AnimalistasK y gracias también a @MarcoPedroza225 por hacerlo visible. \n\n¡El colmo! Las personas que se están desentendiendo de los animalitos. Por eso se requiere que permitan estos días los permisos a ciertos rescatistas que sabemos cuidarlos. https://t.co/... DiaAnimales

los hashtags más usados en la comunidad 3 son:

_id count
0 SimulacroVital 44
1 VayaPaLaCasa 11
2 AislamientoObligatorio 11
3 Usme 6
4 bogota 3
In [106]:
display(Markdown(str("## Los post de Facebook con la palabra Bogotá que más interacciones tuvieron en este periodo de tiempo fueron:")))

Image(filename='./8_Facebook.png')

Los post de Facebook con la palabra Bogotá que más interacciones tuvieron en este periodo de tiempo fueron:

Out[106]:
In [107]:
display(Markdown(str("## Los post de Instagram con la palabra Bogotá que más interacciones tuvieron en este periodo de tiempo fueron")))
Image(filename='./8_Instagram.png')

Los post de Instagram con la palabra Bogotá que más interacciones tuvieron en este periodo de tiempo fueron

Out[107]:

Lista twitteros importantes en la conversación

In [108]:
usuarios_importantes=[]
for comunidad in comunidades_importantes:
    usuarios_importantes.extend(top_reacciones[comunidad])
    usuarios_importantes.extend(top_creadores[comunidad])
    #usuarios_importantes.extend(top_influencers[comunidad])

usuarios_importantes=set(usuarios_importantes)

f = open("./twitteros_importantes_conversación_simulacro2.txt", "a")
for line in usuarios_importantes:
    f.write(line)
    f.write("\n")
    print(line)
f.close()
@sasalin28
@wradiocolombia
@policiacmarca
@trotaaa
@cundinamarcagob
@yobaniperdomos
@solstereofm
@jfervargascr
@mellanovha
@luciaziqueira
@nelsongomez09
@ambientebogota
@mpilarmunoz1
@animalesbog
@edwinpabon36
@danielbejarano_
@juliherrerap
@claudialopez
@marcialito29
@corferiasbogota
@theogelves
@jimmyapa
@bogota
@diaanimales
@pnalllano
@alejitamaya84
@banpercie
@nicolasgarciab
@andreanimalidad